/**
 * javaHispano 2008
 */
package org.javahispano.jwitter.view.controller;



import java.io.IOException;
import java.io.OutputStream;
import java.security.Principal;

import org.apache.log4j.Logger;
import org.javahispano.jwitter.services.RegistroService;
import org.javahispano.jwitter.view.command.UsuarioCommand;
import org.javahispano.jwitter.view.validator.UsuarioValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author javaHispano
 * Controlador de las pantallas del Usuario.<br/>
 * usamos el estereotipo Controller para no tener que declarar los beans
 * dentro sel springmvc-servlet.xml. Spring escaneara nuestro paquete e instanciara
 * todos aquellos anotados con dicho estereotipo. Otra alternativa seria
 * declarar cada controller como un bean con el tag &lt;bean&gt;<br/>	
 * Todos los metodos de un controlador que esten anotados con RequestMapping 
 * son mapeados a la url especificada por el DefaultAnnotationHandlerMapping 
 * declarado en springmvc-servlet.xml. La url del RequestMapping acepta 
 * valores tipo ant, por ejemplo *.html mapearia todas las urls que terminen en html a un metodo
 * o /pdf/*.pdf todas las urls tipo http://servidor/contexto/pdf/informe.pdf<br/> 
 * Los parametros recibidos por los metodos son pasados por SpringMVC. Estos parametros pueden 
 * ser desde parametros del request (del tipo pagina.html?id=3) usando la anotacion "@RequestParam", 
 * un bean que ha sido llenado con los datos de un formulario, 
 * el HttpServletRequest y HttpServletResponse, etc. Puedes encontrar
 * la lista entera en el javadoc de RequestMapping
 */
@Controller
public class UsuarioController {
	
	private static Logger log = Logger.getLogger(UsuarioController.class.getName());
	
	/**
	 * Las propieades anotadas con Autowired son inyectadas por Spring. Por defecto
	 * Spring inyecta el primer bean de la misma clase que la propiedad anotada.
	 * Este comportamiento se puede cambiar, por ejemplo si tienes varios beans
	 * con el mismo tipo y quieres especificar que se inyecte uno en especifico,
	 * puedes usar la anotacion "@Qualifier" o la especificacion JSR-250 con
	 * la anotacion "@Resource" 
	 */
	@Autowired
	private RegistroService registroService;
	
	@Autowired
	private UsuarioValidator usuarioValidator;
	
	
	/**
	 * Se encarga de presentar el formulatio. Notese que se especifica que solo 
	 * atiende a las peticiones de tipo GET. Al no regresar un String
	 * con el nombre de la vista a desplegar, Spring despliega aquella con
	 * el mismo prefixo de la url en este caso "registro" y el sufijo
	 * especificado en el ViewResolver (.ftl para Freemarker o .jsp)
	 * @param model
	 */
	@RequestMapping(value="/registro.html", method=RequestMethod.GET)
	public void registrarForm(ModelMap model){
		model.addAttribute("usuario", new UsuarioCommand());
	}
	
	
	/**
	 * Se encarga de recibir el formulario de registro. Reciimos un 
	 * ModelAtribute. Spring se encarga de llenar el objeto command 
	 * con los datos del formulario. El BindingResult nos sirve para
	 * guardar el resultado de la validacion
	 * @param command
	 * @param result
	 * @return Nombre de la vista a desplegar
	 */
	@RequestMapping(value="/registro.html", method=RequestMethod.POST)	
	public String registrar(@ModelAttribute("usuario") UsuarioCommand command,  BindingResult result){
		//Validamos los datos introducidos por el usuario
		usuarioValidator.validate(command, result);
		if(result.hasErrors()){
			log.debug("Errores en el registro");
			return "registro";
		}		
		//Registramos al usuario
		registroService.registrarUsuario(command);
		return "registrado";
	}
	
	@RequestMapping("/anadir_contacto.html")
	public String anadirContacto(Principal principal, @RequestParam(value="usuario", required=true) String contacto) {
		registroService.addContact(principal.getName(), contacto);
		return "redirect:mi_jwitter.html";
	}
	
	
	
	/**
	 * Escribe en el outputstream del response la foto del usuario, si el usuario no tiene foto devuelve una 
	 * por default
	 * @param id Username del usuario como parametro de request, ej: foto.html?id=miusuario
	 * @param out Outputstream Outputstream del HttpServletResponse, Spring MVC lo envia automaticamente
	 */
	@RequestMapping("/foto.html")
	public void foto(@RequestParam(value="id", required=true) String id, OutputStream out)throws IOException{
		byte[] foto = registroService.recuperaFoto(id);
		if(foto != null){
			
			out.write ( foto); 
			
			out.flush();
			out.close();
		}
	}
	
	/**
	 * Simplemente presenta el formulario de login
	 */
	@RequestMapping(value="/login.html", method=RequestMethod.GET)
	public void loginForm(){
		
	}

	public void setRegistroService(RegistroService registroService) {
		this.registroService = registroService;
	}



	public void setUsuarioValidator(UsuarioValidator usuarioValidator) {
		this.usuarioValidator = usuarioValidator;
	}



	
}
